• socket函数

    1
    int socket(int domain, int type, int protocol)
    • domain:主机采用的通讯协议族(AF_UNIX和AF_INET),AF_UNIX只能够用于单一的Unix系统进程间进行通信,而AF_INET是针对Internet的。因而允许在远程主机之间进行通信。
    • type:采用的通信协议(SOCK_STREAM、SOCK_DGRAM等),SOCK_STREAM表明我们用的是TCP协议,而SOCK_DGRAM表示使用的是UDP协议。
    • protocol:由于指定了type,所以protocol的值一般为0

    socket()函数成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况。

  • bind函数

    1
    int bind(int sockfd, struct sockaddr* my_addr, int addrlen);
    • sockfd:socket函数返回的文件描述符

    • addrlen:是sockaddr结构的长度

    • my_addr:一个指向sockaddr的指针,struct sockaddr的定义如下:

      1
      2
      3
      4
      struct sockaddr {
      unsigned short as_family;
      char sa_data[14];
      };

      不过由于系统的兼容性,一般不用这个头文件,而使用另外一个结构(struct sockaddr_in)来代替,其定义如下:

      1
      2
      3
      4
      5
      6
      struct sockaddr_in {
      unsigned short sin_family;
      unsigned short int sin_port;
      struct in_addr sin_addr;
      unsigned char sin_zero[8];
      };

      我们主要使用Internet,所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表示可以和任何的主机通信,sin_port是监听的端口号,sin_zero[8]是用来填充的。

    bind函数的作用就是将本地的端口和socket函数返回的文件描述符捆绑在一起,成功时返回0。

  • linten函数

    1
    int linten(int sockfd, int backlog);
    • sockfd:是bind后的文件描述符
    • backlog:设置请求队列的最大长度

    listen函数的作用就是bind的文件描述符转为监听套接字。

  • accept函数

    1
    int accept(int sockfd, struct sockaddr* addr, int* addrlen);
    • sockfd:是listen后的文件描述符
    • addr、addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了,bind、listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接,accept成功时返回最后的服务器端的文件描述符,这个时候服务器端就可以向该描述符写信息了。
  • connect函数

    1
    int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);
    • sockfd:socket返回的文件描述符
    • serv_addr:存储了服务器端的连接信息,其中sin_addr是服务端的地址
    • addr_len:serv_addr的长度

    connect函数是客户端用来同服务端连接的,成功时返回0。

  • setsockopt函数

    1
    int setsockopt(socket s, int level, int optname, const char* optval, int optlen);
    • s:指向一个打开的套接字描述符
    • level:
      • SOL_SOCKET:基本套接口
      • IPPROTO_IP:IPV4套接口
      • IPPROTO_IPV6:IPV6套接口
      • IPPROTO_TCP:TCP套接口
    • optname:选项名称
    • optval:指针,指向存放选项值的缓冲区
    • optlen:optval缓冲区长度
  • inet_ntop函数

    1
    const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);

    这个函数转换网络二进制结构到ASCII类型的地址。

    • af:地址簇,其取值可以为AF_INET、AF_INET6
    • src:来源地址
    • dst:接收转换后的数据
    • cnt:缓冲区dst的大小
  • ntohs函数

    将一个16位数由网络字节序转换为主机字节顺序。